Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

302
Vistas
Diferencia entre ANY(ARRAY[..]) vs ANY(VALUES (), () ..) en PostgreSQL

Estoy tratando de entrenar la optimización de consultas en id. No estoy seguro de cuál debo usar. A continuación se muestra el plan de consulta que utiliza la explain y el costo es similar.

 1. explain (analyze, buffers) SELECT * FROM table1 WHERE id = ANY (ARRAY['00e289b0-1ac8-451f-957f-e00bc289148e'::uuid,...]); QUERY PLAN: Index Scan using table1_pkey on table1 (cost=0.42..641.44 rows=76 width=835) (actual time=0.258..2.603 rows=76 loops=1) Index Cond: (id = ANY ('{00e289b0-1ac8-451f-957f-e00bc289148e,...}'::uuid[])) Buffers: shared hit=231 read=73 Planning Time: 0.487 ms Execution Time: 2.715 ms) 2. explain (analyze, buffers) SELECT * FROM table1 WHERE id = ANY (VALUES ('00e289b0-1ac8-451f-957f-e00bc289148e'::uuid),...); QUERY PLAN: Nested Loop (cost=1.56..644.10 rows=76 width=835) (actual time=0.058..0.297 rows=76 loops=1) Buffers: shared hit=304 -> HashAggregate (cost=1.14..1.90 rows=76 width=16) (actual time=0.049..0.060 rows=76 loops=1) Group Key: "*VALUES*".column1 -> Values Scan on "*VALUES*" (cost=0.00..0.95 rows=76 width=16) (actual time=0.006..0.022 rows=76 loops=1) -> Index Scan using table1_pkey on table1 (cost=0.42..8.44 rows=1 width=835) (actual time=0.002..0.003 rows=1 loops=76) Index Cond: (id = "*VALUES*".column1) Buffers: shared hit=304 Planning Time: 0.437 ms Execution Time: 0.389 ms

Parece que VALUES () hace algo de hash y se une para mejorar el rendimiento, pero no estoy seguro.

NOTA: En mi caso de uso práctico, la id es uuid_generate_v4() ex d31cddc0-1771-4de8-ad41-e6c568b39a5d pero es posible que la columna no esté indexada como tal. Además, tengo una tabla con 5-10 million records . ¿Qué camino es para el mejor rendimiento de la consulta?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Ambas opciones parecen razonables. Sin embargo, sugeriría evitar convertir la columna en la que filtra. En su lugar, debe convertir los valores literales a uuid :

 SELECT * FROM table1 WHERE id = ANY (ARRAY['00e289b0-1ac8-451f-957f-e00bc289148e'::uuid, ...]);

Esto debería permitir que la base de datos aproveche un índice en la columna id .

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda